/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = tonglinkq_core.h                                              */
/*  NOTE      =                                                               */
/*  DATE      = 2015/07/15 by wuwk                                            */
/******************************************************************************/
#ifndef _TONGLINKQ_CORE_H_
#define _TONGLINKQ_CORE_H_

#include "frmem.h"
#include "frct_comm.h"
#include "frdb_cursor.h"
#include "frreport_comm.h"
#include "frbyte_buffer.h"
#include "frvar_field.h"

#define TLQ_TONG_JMS                     "Tong_JMS"

#define MQ_MESSAGE_SIZE          "mq.message.size"

#define MQ_NOTIFY_QUEUE           "notify.mq.queue"
#define MQ_NOTIFY_TOPIC            "notify.mq.topic"

#define MQ_REQUEST_QUEUE           "request.mq.queue"
#define MQ_REQUEST_TOPIC            "request.mq.topic"

#define TLQ_NAMELEN               48
#define TLQ_MSGIDLEN              32
#define TLQ_FILEMSG_MAX           512

#define TLQ_REQUEST               0
#define TLQ_RESPONSE              1

#define TLQ_NO                         0
#define TLQ_YES                       1

#define TLQ_MSG_PTP                       0
#define TLQ_MSG_PUB                       1
#define TLQ_MSG_NOTIFY                    2
#define TLQ_MSG_SUB                       3

/* TONGLINKQ session信息 */
typedef struct __st_tonglinkq_L7_session {
    char *p_server;                                   /* 服务名 */
    char *p_queue;                               /* 队列名 */
    char *p_title;
} Tonglinkq_L7session;

/*
*  TONGLINKQ请求数据
*/
typedef struct __st_tonglinkq_frbyte_request {
    unsigned long ul_seq;                             /* 序列号，1次req和response时，使用同一个序列号 */
    int i_responserequired;                           /* 是否需要应答   0:不需要;1:需要 */
    int i_file_flag;                                  /* 消息类型是文件消息 */
    int i_pubsub_flag;
    Frbyte_Packet *p_st_data_req;                     /* request数据 */
    char *p_title;
    char msgid[TLQ_MSGIDLEN + 1];                     /* 消息ID */
    unsigned int ui_data_len;                         /* 数据包解析出来的长度 */
    unsigned int ui_recv_len;                         /* 已经接收的长度 */
    unsigned int ui_left_len;                         /* 还需要接收的长度 */
    Frbyte_Packet *p_st_msg;                          /* 消息数据 */
    unsigned int ui_msg_len;                          /* 消息内容长度 */
    unsigned int ui_msg_left_len;                     /* 剩余的消息长度 */
    Frreport_body_data *p_st_body_data_req;           /* request数据 */
    Frtrans_info st_trans_info;                       /* 传输信息 */
    Tonglinkq_L7session *p_st_L7_session;              /* session信息 */
} Tonglinkq_frbyte_req;

/*
*  TONGLINKQ响应数据
*/
typedef struct __st_tonglinkq_frbyte_response {
    int i_asyn_flag;                                  /* 0:同步数据 1:异步数据 */
    int i_message_ack;                            /* 0:不需要message ack,上报;1:没收到message ack;2:收到message ack */
    int i_msg_size;                                 /* 收到的消息个数 */
    Frbyte_Packet *p_st_data_resp;                    /* response数据 */
    char msgid[TLQ_MSGIDLEN + 1];                     /* 消息ID */
    unsigned int ui_data_len;                         /* 数据包解析出来的长度 */
    unsigned int ui_recv_len;                         /* 已经接收的长度 */
    unsigned int ui_left_len;                         /* 还需要接收的长度 */
    Frreport_body_data *p_st_body_data_resp;          /* response数据 */
} Tonglinkq_frbyte_resp;

/* 请求链表 */
typedef struct __st_tonglinkq_frbyte_req_list {
    Tonglinkq_frbyte_req *p_st_node;
    struct __st_tonglinkq_frbyte_req_list *next;
} Tonglinkq_frbyte_req_list;

/* 未上报的请求 */
typedef struct __st_tonglinkq_report_list {
    unsigned long ul_seq;
    int i_responserequired;
    Frreport_body_data *p_st_req_list;
    Frtrans_info st_trans_info;
    struct __st_tonglinkq_report_list *next;
} Tonglinkq_report_list;

/*
 *  TONGLINKQ私有数据
*/
typedef struct __st_L7session_tonglinkq_private {
    int i_index;                                       /* 响应对应的请求链表的索引 */
    int i_jms_flag;
    int i_isnotify;
    int i_istopic;
    int i_resp_code;
    Tonglinkq_frbyte_req_list *p_lst_req;              /* 未响应的请求数据 */
    Tonglinkq_report_list *p_lst_report;               /* 未上报的请求 */
    Tonglinkq_frbyte_req *p_st_req;                    /* TONGLINKQ请求数据 */
    Tonglinkq_frbyte_resp *p_st_resp;                  /* TONGLINKQ响应数据 */
    Frtrans_info st_trans_info;                        /* 传输信息 */
    char file_name[TLQ_FILEMSG_MAX + 1];               /* 文件名 */
    Tonglinkq_L7session *p_st_L7_session;              /* session信息 */
} L7session_tonglinkq_private;


int tonglinkq_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);
int tonglinkq_analysis(Conntrack *p_st_conn
                     , Apm_packet *p_st_packet
                     , Frhash_header *p_st_hash_report);
int tonglinkq_session_destroy(void *p_private_session);

#endif
